/** 
 * JPanel das die ganzen Datenfelder fuer einen Datentraeger 
 * bereitstellt
 * 
 * 
 * Datei: PanelDatentraeger.java       Autor: Simon Schindelmann 
 * Datum: 26.11.11                     Version: 0.1
 * 
 */
package medienverwaltung.simulation;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import GUI.Dashboard;

import personenverwaltung.Personenverwaltung;
import personenverwaltung.UngueltigesDatumAusnahme;

import medienverwaltung.Abmessung;
import medienverwaltung.Datentraeger;
import medienverwaltung.Datentraegertyp;
import medienverwaltung.DatumParser;
import medienverwaltung.KeinDatumFormat;
import medienverwaltung.Mediumverwalter;
import medienverwaltung.NameEnthaeltZahlenSonderzeichen;

public class PanelDatentraeger extends JPanel
{
  private static final long serialVersionUID = 2162751285040086957L;
  //Speichert die aktuelle Sprache die verwendet wird.
  private Uebersetzung uebersetzung = Uebersetzung.gibSprache ();
  private JButton hinzufuegen;
  private JLabel titel, datum, abmessungen, verlag, ausgabe, notiz,
      fachgebiet, sachgebiet, stichworte, umfang, version,
      spielzeit, teil, typ, serie, beteiligt, speicherplatz, thema;
  private JTextField txt_titel, txt_datum, txt_abmessung_laenge,
      txt_abmessung_breite, txt_abmessung_hoehe, txt_verlag,
      txt_ausgabe, txt_notiz, txt_fachgebiet, txt_sachgebiet,
      txt_stichworte, txt_umfang, txt_serie, txt_status,
      txt_version, txt_teil, txt_beteiligt, txt_spielzeit,
      txt_speicherplatz, txt_thema;
  private String[] typen;
  private JComboBox<String> combo1;
  private Personenverwaltung per = new Personenverwaltung ();


  /**
   * Das Layout wird gesetzt und die Labels, Textfelder und Buttons 
   * werden initialisiert und dem JPanel hinzugefuegt.
   */
  public PanelDatentraeger ()
  {
    init ();
    setLayout (new GridLayout (10, 4));
    add (titel);
    add (txt_titel);
    add (datum);
    add (txt_datum);
    txt_datum.setText (uebersetzung.lokal
        .gibUebersetzung ("TT.MM.JJJJ"));
    add (abmessungen);
    add (txt_abmessung_laenge);
    txt_abmessung_laenge.setText (uebersetzung.lokal
        .gibUebersetzung ("laenge") + " mm");
    add (txt_abmessung_hoehe);
    txt_abmessung_hoehe.setText (uebersetzung.lokal
        .gibUebersetzung ("hoehe") + " mm");
    add (txt_abmessung_breite);
    txt_abmessung_breite.setText (uebersetzung.lokal
        .gibUebersetzung ("breite") + " mm");
    add (ausgabe);
    add (txt_ausgabe);
    add (verlag);
    add (txt_verlag);
    add (notiz);
    add (txt_notiz);
    add (fachgebiet);
    add (txt_fachgebiet);
    add (sachgebiet);
    add (txt_sachgebiet);
    add (stichworte);
    add (txt_stichworte);
    add (umfang);
    add (txt_umfang);
    add (thema);
    add (txt_thema);
    add (beteiligt);
    add (txt_beteiligt);
    add (serie);
    add (txt_serie);
    add (teil);
    add (txt_teil);
    add (version);
    add (txt_version);
    add (spielzeit);
    add (txt_spielzeit);
    txt_spielzeit.setText (uebersetzung.lokal
        .gibUebersetzung ("Minuten"));
    add (speicherplatz);
    add (txt_speicherplatz);
    txt_speicherplatz.setText ("MB");
    add (typ);
    add (combo1);
    add (hinzufuegen, BorderLayout.EAST);
    txt_status.setEditable (false);
    add (txt_status);
  }


  /**
   * Hier werden die Labels, Textfelder, Buttons und ActionListener 
   * initialisiert.
   */
  public void init ()
  {
    titel = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Titel1") + "*: ");
    datum = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Datum") + "*: ");
    abmessungen = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Abmessung") + "*: ");
    verlag = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Verlag1") + ": ");
    ausgabe = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Ausgabe") + ": ");
    notiz = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Notizen") + ": ");
    fachgebiet = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Fachgebiet") + ": ");
    sachgebiet = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Sachgebiet") + ": ");
    stichworte = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Stichworte") + ": ");
    umfang = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Umfang") + ": ");
    beteiligt = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Beteiligte Personen")
        + ": ");
    serie = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Serie") + ": ");
    speicherplatz = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Speicherplatz") + ": ");
    teil = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Teil") + ": ");
    typ = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Datentyp") + ": ");
    spielzeit = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Spielzeit") + ": ");
    version = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Version") + ": ");
    thema = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Thema") + ": ");

    txt_titel = new JTextField ();
    txt_datum = new JTextField ();
    txt_abmessung_laenge = new JTextField ();
    txt_abmessung_breite = new JTextField ();
    txt_abmessung_hoehe = new JTextField ();
    txt_verlag = new JTextField ();
    txt_ausgabe = new JTextField ();
    txt_notiz = new JTextField ();
    txt_fachgebiet = new JTextField ();
    txt_sachgebiet = new JTextField ();
    txt_stichworte = new JTextField ();
    txt_umfang = new JTextField ();
    txt_beteiligt = new JTextField ();
    txt_serie = new JTextField ();
    txt_status = new JTextField ();
    txt_speicherplatz = new JTextField ();
    txt_teil = new JTextField ();
    txt_version = new JTextField ();
    txt_spielzeit = new JTextField ();
    txt_thema = new JTextField ();

    typen = new String[3];
    typen[0] = uebersetzung.lokal.gibUebersetzung ("DATEN");
    typen[1] = uebersetzung.lokal.gibUebersetzung ("VIDEO");
    typen[2] = uebersetzung.lokal.gibUebersetzung ("AUDIO");
    combo1 = new JComboBox<String> (typen);

    mouseListenerInit ();

    hinzufuegen = new JButton (uebersetzung.lokal
        .gibUebersetzung ("Datentraeger Hinzufuegen"));
    hinzufuegen.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        try
        {
          hinzufuegen ();
        }
        catch (NameEnthaeltZahlenSonderzeichen e1)
        {
          JOptionPane.showMessageDialog (null, "" + e1.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
        catch (KeinDatumFormat e2)
        {
          JOptionPane.showMessageDialog (null, "" + e2.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
        catch (IllegalArgumentException e3)
        {
          JOptionPane.showMessageDialog (null, "" + e3.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
        catch (UngueltigesDatumAusnahme e4) 
        {
          JOptionPane.showMessageDialog (null, "" + e4.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
      }
    });
  }


  /**
   * Hier werden die Textfelder ausgelesen und der Datentraeger 
   * angelegt. Wenn mindestens die Pflichtfelder richtig ausgefuehlt 
   * wurden. Tritt ein Fehler auf wird die Farbe des Status Feld auf Rot 
   * gesetzt andernfalls auf Gruen und die TextFelder werden geleert.
   * @NameEnthaeltZahlen
   * @KeinDatumFormat Falls das Datum nicht dem Format entspricht.
   * @VergebeneISBNAusnahme wird geworfen wenn schon ein anderes Medium
   * diese ISBN besitzt.
   */
  public void hinzufuegen () throws NameEnthaeltZahlenSonderzeichen, KeinDatumFormat
  {
    Mediumverwalter mv = new Mediumverwalter ();
    Abmessung a;
    int laenge, hoehe, breite;
    Datentraegertyp typ;
    Datentraeger m;

    if (txt_titel.getText ().isEmpty () == true
        || txt_datum.getText ().isEmpty () == true
        || txt_abmessung_laenge.getText ().isEmpty () == true
        || txt_abmessung_hoehe.getText ().isEmpty () == true
        || txt_abmessung_breite.getText ().isEmpty () == true)
    {
      txt_status.setBackground (Color.red);
      txt_status.setText ("");
      JOptionPane.showMessageDialog (null, ""
          + uebersetzung.lokal
              .gibUebersetzung ("Alle mit einem * markierten "
                  + "Felder muessen ausgefuellt werden"), null,
          JOptionPane.WARNING_MESSAGE);
    }
    else
    {
      laenge = DatumParser.stringZuInteger (txt_abmessung_laenge
          .getText ());
      breite = DatumParser.stringZuInteger (txt_abmessung_breite
          .getText ());
      hoehe = DatumParser.stringZuInteger (txt_abmessung_hoehe
          .getText ());
      a = new Abmessung (laenge, hoehe, breite);

      typ = null;
      if ( ((String) combo1.getSelectedItem ())
          .equals (uebersetzung.lokal.gibUebersetzung ("DATEN")))
      {
        typ = Datentraegertyp.DATEN;
      }
      else if ( ((String) combo1.getSelectedItem ())
          .equals (uebersetzung.lokal.gibUebersetzung ("VIDEO")))
      {
        typ = Datentraegertyp.VIDEO;
      }
      else if ( ((String) combo1.getSelectedItem ())
          .equals (uebersetzung.lokal.gibUebersetzung ("AUDIO")))
      {
        typ = Datentraegertyp.AUDIO;
      }

      m = new Datentraeger (txt_titel.getText (), txt_datum.getText (),
          a, typ);

      if (txt_notiz.getText ().isEmpty () == false)
      {
        m.notizHinzufuegen (txt_notiz.getText (), per
            .gibBenutzer (Dashboard.nutzerID ()));
      }

      if (txt_sachgebiet.getText ().isEmpty () == false)
      {
        m.setzeSachgebiet (txt_sachgebiet.getText ());
      }

      if (txt_fachgebiet.getText ().isEmpty () == false)
      {
        m.setzeFachgebiet (txt_fachgebiet.getText ());
      }

      if (txt_stichworte.getText ().isEmpty () == false)
      {
        m.stichwortHinzufuegen (txt_stichworte.getText ());
      }

      if (txt_umfang.getText ().isEmpty () == false)
      {
        m.setzeUmfang (txt_umfang.getText ());
      }

      if (txt_verlag.getText ().isEmpty () == false)
      {
        m.setzeVerlag (txt_verlag.getText ());
      }

      if (txt_ausgabe.getText ().isEmpty () == false)
      {
        m.setzeAusgabe (txt_ausgabe.getText ());
      }

      if (txt_serie.getText ().isEmpty () == false)
      {
        m.setzeSerie (txt_serie.getText ());
      }

      if (txt_thema.getText ().isEmpty () == false)
      {
        m.setzeThema (txt_thema.getText ());
      }

      if (txt_speicherplatz.getText ().isEmpty () == false
          && !txt_speicherplatz.getText ().equals ("MB"))
      {
        try
        {
          m.setzeSpeicherplatz (DatumParser
              .stringZuLong (txt_speicherplatz.getText ()));
        }
        catch (IllegalArgumentException e1)
        {
          JOptionPane.showMessageDialog (null, "" + uebersetzung
              .lokal.gibUebersetzung ("Keine gueltige Speicherplatz" +
              " Angabe") + "\n" + uebersetzung.lokal.gibUebersetzung
              ("Nur positive ganze Zahlen erlaubt"), null, 
              JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
          return;
        }
      }

      if (txt_teil.getText ().isEmpty () == false)
      {
        m.setzeTeil (txt_teil.getText ());
      }

      if (txt_spielzeit.getText ().isEmpty () == false
          && !txt_spielzeit.getText ().equals (
              uebersetzung.lokal.gibUebersetzung ("Minuten")))
      {
        try
        {
          m.setzeSpielzeit (DatumParser.stringZuInteger (txt_spielzeit
              .getText ()));
        }
        catch (IllegalArgumentException e1)
        {
          JOptionPane.showMessageDialog (null, "" + uebersetzung.
              lokal.gibUebersetzung ("Keine gueltige Spielzeit " +
              "Angabe") + "\n" + uebersetzung.lokal.gibUebersetzung 
              ("Nur positive ganze Zahlen erlaubt"), null, 
              JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
          return;
        }
      }

      if (txt_version.getText ().isEmpty () == false)
      {
        m.setzeVersion (txt_version.getText ());
      }

      if (txt_beteiligt.getText ().isEmpty () == false)
      {
        m.beteiligteHinzufuegen (txt_beteiligt.getText ());
      }

      mv = new Mediumverwalter ();
      mv.mediumHinzufuegen (m);
      txt_status.setBackground (Color.green);
      txt_status.setText ("ID: "+ m.gibMediumId ());
      clear ();
    }
  }


  /**
   * Wenn das Anlegen des Datentraegers erfolgreich war, wird der Inhalt
   * der Textfelder entfernt.
   */
  public void clear ()
  {
    txt_titel.setText ("");
    txt_datum.setText (uebersetzung.lokal
        .gibUebersetzung ("TT.MM.JJJJ"));
    txt_abmessung_laenge.setText (uebersetzung.lokal
        .gibUebersetzung ("laenge") + " mm");
    txt_abmessung_breite.setText (uebersetzung.lokal
        .gibUebersetzung ("breite") + " mm");
    txt_abmessung_hoehe.setText (uebersetzung.lokal
        .gibUebersetzung ("hoehe") + " mm");
    txt_verlag.setText ("");
    txt_ausgabe.setText ("");
    txt_notiz.setText ("");
    txt_fachgebiet.setText ("");
    txt_sachgebiet.setText ("");
    txt_stichworte.setText ("");
    txt_umfang.setText ("");
    txt_beteiligt.setText ("");
    txt_serie.setText ("");
    txt_thema.setText ("");
    txt_version.setText ("");
    txt_teil.setText ("");
    txt_spielzeit.setText (uebersetzung.lokal
        .gibUebersetzung ("Minuten"));
    txt_speicherplatz.setText ("MB");
    combo1.setSelectedIndex (0);
  }


  /**
   * Die Methode initialisiert die MouseListener. Es wird fest gelegt 
   * das sich in einigen Textfeldern der Inhalt entfernen soll wenn rein
   * geklickt wird.
   */
  public void mouseListenerInit ()
  {
    txt_abmessung_laenge.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_abmessung_laenge.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });

    txt_abmessung_breite.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_abmessung_breite.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });

    txt_abmessung_hoehe.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_abmessung_hoehe.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });

    txt_spielzeit.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_spielzeit.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });

    txt_speicherplatz.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_speicherplatz.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });
    
    txt_datum.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_datum.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });
  }
}
